package com.ljy.my_study.leetcode.二叉树的最大深度;

import com.ljy.my_study.util.TreeNodeUtil;
import com.ljy.my_study.util.TreeNodeUtil.*;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author lijunying
 * @date 2020/7/28 9:17
 */
public class TestMain {

//    给定一个二叉树，找出其最大深度。
//
//    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
//
//    说明: 叶子节点是指没有子节点的节点。
//
//    示例：
//    给定二叉树 [3,9,20,null,null,15,7]，
//
//            3
//            / \
//            9  20
//            /  \
//            15   7
//    返回它的最大深度 3 。

    public static void main(String[] args) {
        TreeNode root=TreeNodeUtil.deserialize("1,2,3,4,#,#,5,6,8,9,10,11,12,#,14,15,16,13,16");
        System.out.println(new TestMain().maxDepth(root));
        System.out.println(new TestMain().maxDepth2(root));
    }

    public int maxDepth2(TreeNode root) {
        if(root==null){
            return 0;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        int count=1;
        queue.offer(root);
        int level=0;
        while(!queue.isEmpty()){
            int nextCount=0;
            level++;
            while(count-->0){
                TreeNode node=queue.poll();
                if(node.left!=null){
                    queue.offer(node.left);
                    nextCount++;
                }
                if(node.right!=null){
                    queue.offer(node.right);
                    nextCount++;
                }
            }
            count=nextCount;
        }
        return level;
    }

    public int maxDepth(TreeNode root) {
        if(root==null){
            return 0;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        int level=1;
        queue.offer(root);
        int num=1;
        while(true){
            if(num==0){
                break;
            }
            int nextNum=0;
            for(int i=0;i<num;i++){
                TreeNode node=queue.poll();
                if(node.left!=null||node.right!=null){
                    if(node.left!=null){
                        queue.offer(node.left);
                        nextNum++;
                    }
                    if(node.right!=null){
                        queue.offer(node.right);
                        nextNum++;
                    }
                }
            }
            if(nextNum!=0){
                level++;
            }
            num=nextNum;
        }
        return level;
    }

//    public static class TreeNode {
//        int val;
//        public TreeNode left;
//        public TreeNode right;
//        public TreeNode(int x) { val = x; }
//    }
}
